查看原文
其他

大邓 2018-05-24

经常遇到复杂嵌套字典数据,我们都是这么写的

data = {'a': {'b': {'c': 'd'}}}

print(data['a']['b']['c'])
'd'

然后经常遇到这个bug

data2 = {'a': {'b': None}}

print(data2['a']['b']['c'])
Traceback (most recent call last): ... TypeError: 'NoneType' object is not subscriptable

有没有觉得['a']['b']['c']这样写既麻烦,还不靠谱。glom的出现可以完美的解决这个问题。


glom地址 https://github.com/mahmoud/glom

Python's nested data operator (and CLI), for all your declarative restructuring needs.

python嵌套数据操作库,满足您所有的数据重构需要。

一、glom.glom

glom.glom(target, spec,**kwargs)

  • target:你传入的字典数据

  • spec:关键词路径。相当于过去的['a']['b']['c'],但是在glom中,路径的写法简化为'a.b.c'

  • default:如果字典中没有关键词,那么返回默认default的值。

  • skip_exc:一个可选的异常异常或元组忽略并返回默认值。如果glom中没有设置default和skip_exc,那么会引起报错。

具体代码

from glom import glom data = {'a': {'b': {'c': 'd'}}}

print(glom(data, 'a.b.c'))

#data中没有d这个key,设置default后就不会保存
print(glom(data, 'a.b.c.d', default='错了'))

#没有设置default,报错
print(glom(data, 'a.b.c.d'))
d 错了 raise PathAccessError(e, parts, i) glom.core.PathAccessError: could not access 'd', index 3 in path Path('a', 'b', 'c', 'd'), got error: AttributeError("'str' object has no attribute 'd'",)

二、glom.Path

上面关键词顺序'a.b.c'在大部分都是可以用的。但是有时候字典中的key是带有 '.'的,或者key是整数数字,刚刚的方法会有问题。

target = {'a': {'b': 'c', 'd.e': 'f', 2: 3}}

print(glom(target, 'a.2'))

print(glom(target, 'a.d.e'))
KeyError: '2' During handling of the above exception, another exception occurred: glom.core.PathAccessError: could not access '2', index 1 in path Path('a', '2'), got error: KeyError('2',)

这时候我们需要使用Path来处理这些情况。

from glom import glom, Path target = {'a': {'b': 'c', 'd.e': 'f', 2: 3}}

print(glom(target, Path('a', 2)))

print(glom(target, Path('a', 'd.e')))
3 f

三、glom.Literal

有时候我们需要对字典数据进行替换操作。 如

target = {'a': {'b': 'c'}}
target['a'] = target['a'
]['b']
target['readability'] = 'counts'

print(target)
{'a': 'c', 'readability': 'counts'}

而在glom中,是这样实现的。Literal告诉glom.glom我这次传入的是value,而不是字典的key。 

target = {'a': {'b': 'c'}}

spec = {'a': 'a.b', 'readability': Literal('counts')}

print(glom(target, spec))
{'a': 'c', 'readability': 'counts'}

四、glom.Coalesce

有时候我们不知道字典中有哪些关键词,这时候可能要一个个的试验。在glom中提供了Coalesce,可以给glom.glom我传入的是多个key,你都给在字典里找找,找到了告诉我结果。

target = {'c': 'd'}

print(glom(target, Coalesce('a', 'b', 'c')))
d

假如字典中一个都没找到,会引起程序报错。所以我们要设置default参数。

target = {}

print(glom(target, Coalesce('a', 'b', 'c'), default='d-fault'))
d-fault

五、glom.OMIT

OMIT意思是移除。在glom.glom中的spec参数这里我们可以传入含有lambda表达式的字典。

下面代码中的t指代target字典本身。如果target['a']=='a',那么target不变。

如果target['a']!=='a',那么OMIT,即移除。

target = {'a': 'b'}

spec = {'a': lambda t: t['a'] if t['a'] == 'a' else OMIT}

print(glom(target, spec))
{}target = {'a': 'a'}

print(glom(target, spec))
{'a': 'b'}


长按下方小程序码 向大邓打赏或提问


往期文章

100G Python学习资料:从入门到精通! 免费下载  

为什么你要为2019,而不是2018做计划?  

机器学习|八大步骤解决90%的NLP问题

我分享文章的不良动机就是为了涨粉! 

初识K-means算法

2017年度15个最好的数据科学领域Python库 

如何从文本中提取特征信息? 

对于中文,nltk能做哪些事情 

留在网上的每个字,都在泄露你的身份

优雅简洁的列表推导式

Get小技巧等分列表

如何对数据进行各种排序?

【视频讲解】Scrapy递归抓取简书用户信息

美团商家信息采集神器 

gevent:异步理论与实战  

轻盈高效的异步访问库grequests库

selenium驱动器配置详解

爬虫神器PyQuery的使用方法

简易SQLite3数据库学习

Python通过字符串调用函数

Python圈中的符号计算库-Sympy

Python中处理日期时间库的使用方法 




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存